package com.jade.framework.mom;

import java.util.List;

/**
 * 消息队列服务。.
 *
 * @author Daisy
 * @version 1.0 14-8-1 上午9:51
 */
public interface MomService
{
    /**
     * 发送消息。
     *
     * @param topic      消息主题
     * @param key        消息key
     * @param tag        消息标签
     * @param delayLevel 延迟级别
     * @param msg        消息体
     * @return 消息发送结果
     * @throws MomException 消息发送异常
     */
    public MomSendResult send(String topic, String key, String tag, int delayLevel, Object msg)
            throws MomException;

    /**
     * 发送消息。
     *
     * @param message 消息对象
     * @return 消息发送结果
     * @throws MomException 消息发送异常
     */
    public MomSendResult send(MomMessage message)
            throws MomException;

    /**
     * 发送消息。
     *
     * @param message  消息对象
     * @param callback 发送回调器
     * @throws MomException 消息发送异常
     */
    public void send(MomMessage message, MomSendCallback callback)
            throws MomException;

    /**
     * 根据消息ID获取消息。
     *
     * @param topic 消息主题
     * @param msgId 消息ID
     * @return 消息对象
     * @throws MomException 查询异常
     */
    public MomMessage getMessage(String topic, String msgId)
            throws MomException;

    /**
     * 根据消息Key获取消息。
     *
     * @param topic  消息主题
     * @param key    消息key
     * @param maxNum 最大数目
     * @return 消息列表
     * @throws MomException 查询异常
     */
    public List<MomMessage> listMessage(String topic, String key, int maxNum)
            throws MomException;

    /**
     * 根据消息Key获取消息，如果应用中key是唯一的，那么采用这个方法。
     *
     * @param topic 消息主题
     * @param key   消息key
     * @return 消息对象。
     * @throws MomException 查询异常
     */
    public MomMessage getSingleMessage(String topic, String key)
            throws MomException;

    /**
     * 根据主题获取生产者。
     *
     * @param topic 消息主题
     * @return 消息生产者
     */
    public MomProducer getProducer(String topic);

    /**
     * 根据主题获取消费者。
     *
     * @param topic 消息主题
     * @return 消息消费者。
     */
    public MomConsumer getConsumer(String topic);

    /**
     * 添加消息生产者。
     *
     * @param topic    消息主题
     * @param producer 消息生产者者。
     */
    public void addProducer(String topic, MomProducer producer);

    public void startProducer(String topic);

    public void stopProducer(String topic);

    /**
     * 添加消息消费者。
     *
     * @param topic    消息主题。
     * @param consumer 消息消费者。
     */
    public void addConsumer(String topic, MomConsumer consumer);

    public void startConsumer(String topic);

    public void stopConsumer(String topic);
}
